﻿//2875. 无限数组的最短子数组
//给你一个下标从 0 开始的数组 nums 和一个整数 target 。
//下标从 0 开始的数组 infinite_nums 是通过无限地将 nums 的元素追加到自己之后生成的。
//请你从 infinite_nums 中找出满足 元素和 等于 target 的 最短 子数组，
//并返回该子数组的长度。如果不存在满足条件的子数组，返回 - 1 。


class Solution {
public:
    int minSizeSubarray(vector<int>& nums, int target)
    {
        int n = nums.size();
        long long sum = 0;
        for (auto& e : nums)  sum += e;
        int left = 0, right = -1;
        long long h = 0;
        int ans = INT_MAX;
        for (right = 0; right < 2 * n; right++)
        {
            h += nums[right % n];
            while (h > (target % sum))
            {
                h -= nums[left % n];
                left++;
            }
            if (h == (target % sum))
                ans = min(ans, right - left + 1);
        }
        return ans == INT_MAX ? -1 : ans + target / sum * n;
    }
};